home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 158_01 / qe1 < prev    next >
Text File  |  1987-10-10  |  8KB  |  366 lines

  1. /*  VERSION 0006  (DATE: 23/09/86)  (TIME: 10:37)  */
  2. /*
  3.     e (qe) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.     Modified: To QE from e (ver 4.6a) by J.W. Haefner -- Oct 84-Mar 85
  9.  
  10.     FILE: qe1
  11.  
  12.     FUNCTIONS: dirmsk, expmsk,
  13.         printdirectory, envir, files, putonoff, getnumb, getlow
  14.  
  15.     PURPOSE:  environment; change files.
  16.  
  17. */
  18.  
  19. #include "qe.h"
  20.  
  21. #define EXTENT 12
  22. #define RECORDS 15
  23. #define EXTSIZ 128
  24.  
  25. dirmsk()
  26.  
  27. {
  28.     char *pattp;
  29.     sint drv;
  30.  
  31.     pattp = patt;     /* use pattern find array to save extnl space */
  32.     if (scans(patt,FILELEN) == ESCKEY) return (YES);
  33.     drv = curdsk+1;        /* drv = num for bdos file search */
  34.     if (!*pattp) pattp = "*.*";
  35.     else
  36.         if (patt[1] == ':') {
  37.             if (  ((drv = (toupper(*pattp) - '@')) < 1) || (drv > 16)  )
  38.                 drv = curdsk+1;
  39.             pattp += 2;
  40.         }
  41.     expmsk(drv,pattp);
  42. }
  43.  
  44. expmsk(drv,str)  /* create wildcard cp/m filename from str*/
  45. sint drv;
  46. char *str;
  47.  
  48. /*  input:  str: a user input string to expand to legal cp/m wildcard name
  49.     output:    dirmsk: a string wh/ is a legal cp/m wildcard file name */
  50.  
  51. {          /* 10 */
  52.     sint stop,inmsk,inwild;
  53.     char c, wildarray[15], *wildname;
  54.  
  55.     for (inwild=0;inwild<15;wildarray[inwild++]=' ');
  56.     wildname = wildarray;    /* use pattern change array to save space */
  57.     wildname[0] = drv;
  58.     wildname[12] = '?';
  59.     wildname[14] = '\0';
  60.     stop = 8;
  61.     inmsk = 0;        /* index for input mask */
  62.     inwild = 1;        /* index for directory mask (output) */
  63.     while ((wildname[inwild]) && (str[inmsk]))  {
  64.         switch (c=str[inmsk++])  {    /*30*/
  65.         case '*' :
  66.             for( ; (inwild <= stop);inwild++)
  67.                 wildname[inwild] = '?';
  68.             stop = 11;
  69.             break;
  70.         case '.' :
  71.             inwild = 9;
  72.             stop = 11;
  73.             break;
  74.         default:
  75.             wildname[inwild++] = toupper(c);
  76.             break;
  77.         }    /*30*/
  78.     }
  79.     printdirectory(wildname);
  80. }    /*10*/
  81.  
  82.  
  83. printdirectory(wildname)
  84. char *wildname;
  85. {
  86.     int y, *dsm, cols, loc, i, ndb, pos;
  87.     unsigned blsr, used, recs;
  88.     char c, a, entriesonline, *bsh, exm, al0;
  89.     char *parms;
  90.     sint dmabuf[128],drive;
  91.  
  92.     putclr();
  93.     bdos(SETDMA,dmabuf);
  94.     drive = wildname[0]-1;
  95.     gotoxy(0,6);
  96.     puts("Directory of "); 
  97.     putch(drive + 'A');
  98.     putch(':');
  99.     if (curdsk != (drive) && seldisk(drive) != FAIL) {
  100.         puts("  |(default drive is ");
  101.         putch(curdsk+'A');
  102.         puts(":|)");
  103.         }
  104.     used=0;
  105.     parms=bdos(DSKPARAMS);
  106.     bsh = parms+2;
  107.     exm = *(parms+4);
  108.     dsm = parms+5;
  109.     al0 = *(parms+9);
  110.     blsr = (1 << *bsh)/8; /*block size in kbytes*/
  111.     for(ndb=0;al0;al0 <<= 1, ndb++);
  112.     entriesonline=0;
  113.     begdim(); 
  114.     deleteline(2,(y=8));
  115.  
  116.     pos=bdos(SEARCH1,wildname);
  117.     while (pos != 0xff) {
  118.         loc= pos << 5;
  119.         recs = (exm) ? EXTSIZ*(dmabuf[loc+EXTENT]%((exm)+1))
  120.                  + dmabuf[loc+RECORDS]
  121.                 : dmabuf[loc+RECORDS];
  122.         used += (recs/(8*blsr))*blsr;
  123.         if (recs%(8*blsr)) used += blsr;
  124.         if (dmabuf[loc+EXTENT] <= exm) {
  125.             for (i=1, cols=0; i < 12; i++) {
  126.                 c= dmabuf[loc+i] & 0x7f;
  127.                 if (i == 9 && c != ' ') {
  128.                     cols++;
  129.                     putch('.');
  130.                     }
  131.                 if (c != ' ') {
  132.                     cols++;
  133.                     putch( (i >= 9 ? tolower(c) : c));
  134.                     }
  135.                 }
  136.             while (cols++ < 12) putch(' ');
  137.             if (++entriesonline == 5) {
  138.                 deleteline(2,++y);
  139.                 if (y == SHEIGHT) { 
  140.                     puts("[||<cr>| for MORE...]");
  141.                     a = getkey();
  142.                     begdim();
  143.                     delpage((y=8));
  144.                     gotoxy(2,8);
  145.                 /*    goto incomplete;     */
  146.                     }
  147.                 entriesonline=0;
  148.                 }
  149.             else puts(" :  ");
  150.             }
  151.         pos=bdos(SEARCHN,wildname);
  152.         }
  153.     gotoxy(50,SHEIGHT);
  154.     for (i=1;((wildname[i]=='?') && (i<12)); i++);
  155.     if (i==12) {
  156.         puts("Free = ");
  157.         uspr((((*dsm+1)-ndb)*blsr)-used);
  158.         puts("k  ");
  159.         }
  160.     puts("Files = ");
  161.     uspr(used);
  162.     putch('k');
  163.     if (curdsk != drive) seldisk(curdsk);
  164.     enddim(); 
  165.     gotoxy(0,0);
  166.     return;
  167. }
  168.  
  169. envir()
  170. {
  171.     char c;
  172.     struct addr anaddr;
  173.  
  174.     puttext();
  175.     do {
  176.         putclr();
  177.         putstatusline(cline);
  178.         gotoxy(0,3);
  179.         puts("Edit context:  |(|F| for file context) \n\n");
  180.         puts("A|uto indent                ");
  181.         putonoff(autoin);
  182.         puts("B|ackup original file       ");
  183.         putonoff(backup);
  184.         puts("T|ab stops every            ");
  185.         uspr(tabwidth);
  186.         puts("\nS|trip trailing blanks      ");
  187.         putonoff(!trail);
  188. #if WWRAP
  189.         puts("R|ight margin               ");
  190.         uspr(rtmarg);
  191.         puts("\n");
  192. #endif
  193.         puts("L|ine:column display        ");
  194.         putonoff(displaypos);
  195.         puts("H|orizontal scroll page     ");
  196.         putonoff(blockscroll);
  197.         puts("E|xpert prompts             ");
  198.         putonoff(expert);
  199.         puts("O|nscreen help              ");
  200.         putonoff(helpon);
  201. #if VRSNNUM
  202.         puts("V|ersion update             ");
  203.         putonoff(version);
  204. #endif
  205.         puts("\n|Memory allows for no more than ");
  206.         uspr( (slotsinmem-2)*PAGESIZE/sizeof(anaddr) ); 
  207.         puts("| lines of text");
  208.  
  209.         puts("\n\n\nTo change, enter capital letter, or enter |Q| to return: ");
  210.         switch((c=getlow())) {
  211.         case 'a': 
  212.             autoin= !autoin; 
  213.             break;
  214.         case 'b': 
  215.             backup= !backup; 
  216.             break;
  217.         case 'l':
  218.             displaypos=!displaypos;
  219.             break;
  220.         case 'h':
  221.             blockscroll=!blockscroll;
  222.             break;
  223.         case 't': 
  224.             puts("\n\n|Enter new |tab width|: ");
  225.             if (!(tabwidth=getnumb())) tabwidth=0;
  226.             break;
  227.         case 's':
  228.             trail=!trail; 
  229.             break;
  230. #if WWRAP
  231.         case 'r':
  232.             puts("\n\n|Enter new |right margin|: ");
  233.             if (!(rtmarg=getnumb())) rtmarg=LLIM;
  234.             if (rtmarg==LLIM) {
  235.                 trail=NO;
  236.                 autoin=YES;
  237.                 }
  238.             else {
  239.                 trail=YES;
  240.                 autoin=NO;
  241.                 }
  242.             break;
  243. #endif
  244.         case 'f': 
  245.             if(files()) goto escape; 
  246.             break;
  247.         case 'e':
  248.             expert = !expert;
  249.             break;
  250.         case 'o':
  251.             helpon = !helpon;
  252.             break;
  253. #if VRSNNUM
  254.         case 'v':
  255.             version = !version;
  256.             break;
  257. #endif
  258.         case 'q': 
  259.         case ESCKEY:
  260.             goto escape;
  261.             }
  262.         } 
  263.     while (YES);
  264. escape:
  265.     putclr();
  266.     topline=1; 
  267.     if (helpon) dohelp();
  268.     putpage();
  269. }
  270.  
  271. files()
  272. {
  273.     char oldname[15], newname[15], c;
  274.     int dir, warn;
  275.  
  276.     dir=curdsk;
  277.     do {
  278. /*        printdirectory(dir);    */
  279.         putclr();
  280.         putstatusline(cline);
  281. newcomm: 
  282.         errmess=NULL;
  283.         gotoxy(0,1);
  284.         puts("|Enter |Q| to return to Edit context     |D| to delete a file\n");
  285.         puts("      R| to rename a file     |>| to view directory  \n");
  286.         deleteline(0,3);
  287.         puts("      C| to change the name of the edited file "); 
  288.         puts(filename);
  289.         deleteline(0,4); 
  290.         deleteline(0,5);
  291.         gotoxy(6,4); 
  292.         c=getlow();
  293.         putstatusline(cline);
  294.         switch (c) {
  295.         case ESCKEY:
  296.             return YES;
  297.         case 'q':    
  298.             return NO;
  299.         case '>':
  300.             deleteline(6,4);
  301.             puts("Enter [drv:]mask| (RET for all) ");
  302.             dirmsk();
  303.             goto newcomm;
  304.         default:
  305.             if (c == 'r' || c == 'd' || c == 'c') {
  306.                 deleteline(6,4);
  307.                 puts("Name of file: "); 
  308.                 scans(oldname,15);
  309.                 if (!oldname[0]) goto newcomm;
  310.                 format(oldname);
  311.                 }
  312.             switch (c) {
  313.             case 'd':    
  314.                 if (funlink(oldname) == FAIL) {
  315.                     error("Can't delete");
  316.                     goto newcomm;
  317.                     }
  318.                 break;
  319.             case 'r' :    
  320.                 deleteline(6,5);
  321.                 puts("New name:     "); 
  322.                 scans(newname,15);
  323.                 format(newname);
  324.                 if (!newname[0] || frename(oldname,newname) == FAIL) {
  325.                     error("Can't rename"); 
  326.                     goto newcomm;
  327.                     }
  328.                 break;
  329.             case 'c'  :    
  330.                 strcpy(filename,oldname); 
  331.                 putstatusline(cline);
  332.             default:
  333.                 goto newcomm;
  334.                 }
  335.             }
  336.  
  337.         } 
  338.     while (YES);
  339. }
  340.  
  341. putonoff(flag)
  342. int flag;
  343. {
  344.     puts(flag?"ON\n":"OFF\n");
  345. }
  346.  
  347. getnumb()
  348. {
  349.     int i, n;
  350.     char c, numb[5];
  351.     scans(numb,5);
  352.     n=qatoi(numb);
  353.     return n;
  354. }
  355.  
  356. qatoi(nstr)
  357. char *nstr;
  358. {
  359.     int i,n;
  360.     char c;
  361.     
  362.     n=0;
  363.     for (i=0; (c=nstr[i]); i++)
  364.         if (c >= '0' && c <= '9') n=n*10+c-'0';
  365.     return n;
  366. }er